﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using AudioCore.DAO;
using AudioCore.Entity;
using AudioCore.Common;

namespace AudioCore.Biz
{
    public class AccountBiz : BaseBiz
    {
        public bool UpdatePasswd(AccountEntity account, string newPasswd)
        {
            try
            {
                using (AccountDao dao = new AccountDao())
                {
                    newPasswd = Utility.EncodePassword(newPasswd);
                    int result = dao.UpdatePasswd(account.AccountID, newPasswd);
                    if (result > 0)
                    {
                        return true;
                    }
                    return false;
                }
            }
            catch (Exception e)
            {
                //do nothing
            }
            return false;
        }

        public AccountEntity GetAccountByUserName(string username)
        {
            try
            {
                using (AccountDao dao = new AccountDao())
                {
                    using (DataTable dt = dao.GetAccountByUserName(username))
                    {
                        List<AccountEntity> list = BaseBiz.MapDataTableToList(dt, typeof(AccountEntity)).ConvertAll(item => (AccountEntity)item);
                        if (list.Count > 0)
                        {
                            return list[0];
                        }
                    }
                }
            }
            catch (SqlException ex)
            {
                // Write error log the log file
            }
            catch (Exception ex)
            {
                // Write error log the log file
            }
            return null;
        }

        public AccountEntity GetAccountByEmail(string email)
        {
            try
            {
                using (AccountDao dao = new AccountDao())
                {
                    using (DataTable dt = dao.SelectEntityByColumnName("Email",email))
                    {
                        List<AccountEntity> list = BaseBiz.MapDataTableToList(dt, typeof(AccountEntity)).ConvertAll(item => (AccountEntity)item);
                        if (list.Count > 0)
                        {
                            return list[0];
                        }
                    }
                }
            }
            catch (SqlException ex)
            {
                // Write error log the log file
            }
            catch (Exception ex)
            {
                // Write error log the log file
            }
            return null;
        }

        public Constant.AccountLoginResult SignIn(AccountEntity accountEntity, out string message)
        {
            Constant.AccountLoginResult result = Constant.AccountLoginResult.Success;
            message = string.Empty;
            try
            {
                using (AccountDao dao = new AccountDao())
                {
                    int accountID = dao.IsExistByUserName(accountEntity.AccountName);
                    if (accountID != -1)
                    {
                        using (DataTable dt = dao.GetAccountByAccountID(accountID))
                        {
                            List<AccountEntity> lstAccount = BaseBiz.MapDataTableToList(dt, typeof(AccountEntity)).ConvertAll(item => (AccountEntity)item);
                            if (lstAccount.Count > 0)
                            {
                                string key = "";
                                string passEncode = "";
                                string[] ss = lstAccount[0].Passwd.Split(new char[] { ':' });
                                if (ss.Length > 1)
                                {
                                    passEncode = ss[0];
                                    key = ss[1];
                                }
                                string pass = Utility.EncodePassword(accountEntity.Passwd, key);
                                if (!pass.Equals(lstAccount[0].Passwd, StringComparison.CurrentCultureIgnoreCase))
                                {
                                    result = Constant.AccountLoginResult.Failed;
                                }
                            }
                            else
                            {
                                result = Constant.AccountLoginResult.UserIsNotExist;
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                result = Constant.AccountLoginResult.Failed;
            }
            if (result == Constant.AccountLoginResult.Failed)
            {
                message = "Mật khẩu không chính xác. Hãy thử lại lần nữa.";
            }
            else if (result == Constant.AccountLoginResult.Success)
            {
                message = "Bạn đã đăng nhập thành công.";
            }
            else if (result == Constant.AccountLoginResult.UserIsNotExist)
            {
                message = "Không tồn tại tài khoản này trong hệ thống. Hãy thử lại lần nữa.";
            }
            return result;
        }

        public bool Login(string username, string passwd, out string message)
        {
            //AccountEntity 
            AccountEntity Account = new AccountEntity();
            Account.AccountName = username;
            Account.Passwd = passwd;
            string msg = null;
            Constant.AccountLoginResult status = SignIn(Account, out msg);

            if (status == Constant.AccountLoginResult.Failed)
            {
                message = "Đăng nhập thất bại. Username or password không chính xác. \r\nVui long thử lại";
                return false;
            }
            else if (status == Constant.AccountLoginResult.UserIsNotExist)
            {
                message = "Tài khoản chưa đăng ký.\r\nĐề nghị truy cập www.ienter.vn để đăng ký tài khoản";
                return false;
            }
            else if (Account.IsStaff == false)
            {
                message = "Tài khoản này không có quyền truy cập hệ thống";
                return false;
            }
            else
            {
                message = "Đăng nhập thành công";
                return true;
            }
        }

        public int Register(string userName, string passwd, string email)
        {
            AccountEntity account = new AccountEntity();
            account.AccountName = userName;
            account.Passwd = passwd;
            account.Mobile = string.Empty;
            account.FullName = string.Empty;
            account.Email = email;
            account.BirthDay = DateTime.Now;
            account.RegisterDateTime = DateTime.Now;
            account.IsStaff = false;
            account.IsManager = false;
            return AddAccount(account);
        }

        public int AddAccount(AccountEntity entity)
        {
            try
            {
                using (AccountDao daoAccount = new AccountDao())
                {
                    return daoAccount.InsertEntity(entity, typeof(AccountEntity));
                }
            }
            catch (Exception ex)
            {
            }
            return 0;
        }

        public int UpdateAccount(AccountEntity entity)
        {
            try
            {
                using (AccountDao daoAccount = new AccountDao())
                {
                    return daoAccount.UpdateEntity(entity, typeof(AccountEntity));
                }
            }
            catch (Exception ex)
            {
            }
            return 0;
        }

        public AccountEntity GetAccountByID(int AccountID)
        {
            try
            {
                using (AccountDao daoAccount = new AccountDao())
                {
                    DataTable table = daoAccount.SelectEntityByID(AccountID);
                    if (table.Rows.Count > 0)
                    {
                        return (AccountEntity)BaseBiz.MapDataRowToObject(table.Rows[0], typeof(AccountEntity));
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return null;
        }

        public bool ValidateUser(int accountID, string password)
        {
            AccountEntity enAccount = GetAccountByID(accountID);
            if (enAccount != null)
            {
                return enAccount.Passwd.Equals(password);
            }
            return false;
        }
    }
}
